#!/usr/bin/env python
# -*- coding: utf-8 -*-
from tool.gongju import *
from tool.zhibiao import ma_z, ema_z, atr_z

QJCS = {'atrzq': 5, 'zfzq': 5, 'pdzq': 2, 'mazq': 20}


def 全局参数控制_v1(cl):
    """
    此策略为指标排序全局参数控制
    """
    # 数据提取区
    Open = cl.klines[0].open.values  # 开盘价np列表
    High = cl.klines[0].high.values   # 最高价np列表
    Low = cl.klines[0].low.values  # 最低价np列表
    Close = cl.klines[0].close.values  # 收盘价np列表，Close[-1]这样为最新价

    # 参数设置区
    ss = cl.jiaoyishezhi[5][0]  # 开仓数量
    QJCS['atrzq'] = cl.jiaoyishezhi[5][1]  # atr周期
    QJCS['zfzq'] = cl.jiaoyishezhi[5][2]+1  # 求涨幅的周期
    QJCS['pdzq'] = cl.jiaoyishezhi[5][3]  # 求偏度周期
    QJCS['mazq'] = cl.jiaoyishezhi[5][4]  # 求角度均线周期

    # 初始化持久化变量
    if 'cczt' not in cl.sjb:  # 初始化时执行一次，用于初始化缓存字典
        cl.sjb['cczt'] = 0  # 持仓状态记录
        # 用于在软件右键策略字典中查看参数输入说明，和指标输出含义说明
        cl.sjb['参数说明'] = {"1": '策略开关及开仓数量', '2': 'atr周期', '3': '求涨幅的周期', '4': '求偏度周期', '5': '求角度均线周期'}
        cl.sjb['输出指标说明'] = {"指标1": 'n日atr', '指标2': 'n日涨幅', '指标3': '收盘价偏度', '指标4': 'n日均线角度'}

    return 'w',  'w', 'w', 'w'


def atr和涨幅排序_v1(cl):
    """
    此策略为双均线演示策略
    :param cl策略类
    :param cl.klines: k线数据，为df表，0层数据用klines[0]表示
    :param cl.openingdata: 交易数据，为字典，里面有持仓状态，理论持仓数量，开仓价格，开仓时间等
    :param cl.zhanghu: 账户列表
    :param cl.jiaoyishezhi: 为交易设置数据，算法交易，交易合约，其他功能参数都在里面
    :param cl.jiaoyiqidong: 是否启动了交易，为TRUS表示启动
    :return: 输出要在软件上显示的指标
    """
    # 数据提取区
    Open = cl.klines[0].open.values  # 开盘价np列表
    High = cl.klines[0].high.values   # 最高价np列表
    Low = cl.klines[0].low.values  # 最低价np列表
    Close = cl.klines[0].close.values  # 收盘价np列表，Close[-1]这样为最新价

    # 参数设置区
    ss = cl.jiaoyishezhi[5][0]  # 开仓数量
    # atrzq1 = cl.jiaoyishezhi[5][1]  # atr周期
    # zfzq2 = cl.jiaoyishezhi[5][2]+1  # 求涨幅的周期
    # pianduzq = cl.jiaoyishezhi[5][3]  # 求偏度周期
    # mazq = cl.jiaoyishezhi[5][4]  # 求角度均线周期

    atrzq1 = QJCS['atrzq']  # atr周期
    zfzq2 = QJCS['zfzq']  # 求涨幅的周期
    pianduzq = QJCS['pdzq']  # 求偏度周期
    mazq = QJCS['mazq']  # 求角度均线周期

    # 初始化持久化变量
    if 'cczt' not in cl.sjb:  # 初始化时执行一次，用于初始化缓存字典
        cl.sjb['cczt'] = 0  # 持仓状态记录
        # 用于在软件右键策略字典中查看参数输入说明，和指标输出含义说明
        cl.sjb['参数说明'] = {"1": '策略开关及开仓数量', '2': 'atr周期', '3': '求涨幅的周期', '4': '求偏度周期', '5': '求角度均线周期'}
        cl.sjb['输出指标说明'] = {"指标1": 'n日atr', '指标2': 'n日涨幅', '指标3': '收盘价偏度', '指标4': 'n日均线角度'}

    # 指标计算区
    atr1 = atr_z(High, Low, Open, atrzq1)
    atr1 = round(atr1[-1]/Close[-1]*100, 2)
    涨幅 = round((Close[-1]-Close[-zfzq2])/Close[-zfzq2]*100, 2)
    s1 = pd.Series(Close[-pianduzq:])  # 转换数据类型
    偏度 = round(s1.skew(), 3)  # 求偏度
    ma = ma_z(Close, mazq)
    均线角度 = round(math.atan((ma[-1] / ma[-3] - 1)*100)*180 / 3.1415926, 3)

    return atr1,  涨幅, 偏度, 均线角度
